/*
******************************************************************************************************* 
**  Copyright (C) 2019, 苏州检易生物科技有限公司 
**  All rights reserved. 
** 
**  FileName:       	pmt.c
**  Description:	
**  Author:        	 
**  Version				v0.1
**  Date:           	2019-05-24
**	Function List： 
**  History:         
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                              	调试开关
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                             INCLUDE FILES
*********************************************************************************************************
*/
#include "crc16.h"
//#include "stm32h7xx_hal.h"

/*
*********************************************************************************************************
*                                              	宏定义
*********************************************************************************************************
*/
//#define HW_CRC  1
/*
*********************************************************************************************************
*                                              	结构体定义
*********************************************************************************************************
*/

 
/*
*********************************************************************************************************
*                                              	函数原型声明
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                              	全局变量定义
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                              	模块静态变量定义
*********************************************************************************************************
*/
#ifdef HW_CRC
CRC_HandleTypeDef h_crc_handle;
#else
static uint32_t crc32_table[256];
#endif
/*
*********************************************************************************************************
*                                              	函数定义
*********************************************************************************************************
*/
uint16_t ModBusCRC(uint8_t* buff,uint16_t len)
{
	uint16_t tmp,CRC16;
	CRC16=0xffff;
	for(uint16_t i=0;i<len;i++)
	{
		CRC16=*buff^CRC16;
		for(uint16_t j=0;j<8;j++)
		{
			tmp=CRC16&0x0001;
			CRC16=CRC16>>1;
			if(tmp)
			{
				CRC16=CRC16^0xa001;
			}
		}
		buff++;
	}
	return (CRC16>>8)|(CRC16<<8);
}
uint32_t CRC32(uint8_t* buff,uint16_t size)
{
#ifdef HW_CRC
	return HAL_CRC_Calculate(&h_crc_handle,(uint32_t*)buff,size);
#else
	uint32_t crc32 = 0xFFFFFFFF;
	while(size--)
		crc32 = (crc32 >> 8)^(crc32_table[(crc32 ^ *buff++)&0xff]);
	return crc32;
#endif
}
void crc32_init(void)
{
#ifdef HW_CRC
	h_crc_handle.Instance = CRC;
	h_crc_handle.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;
	h_crc_handle.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
	HAL_CRC_Init(&h_crc_handle);
#else
	uint32_t c;
	int i = 0;
	int bit = 0;
	for(i = 0; i < 256; i++)
	{
		c  = (uint32_t)i;
		for(bit = 0; bit < 8; bit++)
		{
			if(c&1)
			{
				c = (c >> 1)^(0xEDB88320);
			}
			else
			{
				c =  c >> 1;
			}	
		}
		crc32_table[i] = c;
	}
#endif
}

